#include "BasePort.h"
#include "BaseNode.h"
#include <QStyleOptionGraphicsItem>
#include <QGraphicsSceneMouseEvent>
#include <QCursor>
#include <QApplication>
#include <QDrag>
#include <QMimeData>

BasePort::BasePort(BaseNode* parentNode, PortType type)
    : m_type(type)
    , m_parentNode(parentNode)
    , m_radius(8.0)
    , m_hasData(false)
{
    // 设置端口可以接收鼠标事件
    setAcceptedMouseButtons(Qt::LeftButton);
    
    // 设置端口的Z值，使其显示在节点上方
    setZValue(1);
    
    // 设置鼠标指针样式
    setCursor(Qt::PointingHandCursor);
    
    // 设置端口的父项为节点，这样端口会跟随节点移动
    setParentItem(parentNode);
}

QRectF BasePort::boundingRect() const
{
    // 返回端口的边界矩形（以端口中心为原点）
    return QRectF(-m_radius, -m_radius, m_radius * 2, m_radius * 2);
}

void BasePort::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
{
    Q_UNUSED(option)
    Q_UNUSED(widget)
    
    // 设置抗锯齿渲染
    painter->setRenderHint(QPainter::Antialiasing);
    
    // 根据端口类型和状态设置颜色
    QColor portColor = getPortColor();
    
    // 如果端口有数据，使用更亮的颜色
    if (m_hasData) {
        portColor = portColor.lighter(150);
    }
    
    // 绘制端口圆形（更大更明显）
    painter->setBrush(QBrush(portColor));
    painter->setPen(QPen(Qt::white, 2));
    painter->drawEllipse(boundingRect());
    
    // 绘制内圈，增强视觉效果
    painter->setBrush(QBrush(Qt::white));
    painter->setPen(QPen(Qt::transparent));
    painter->drawEllipse(QRectF(-m_radius/2, -m_radius/2, m_radius, m_radius));
}

void BasePort::setData(const QVariant& data)
{
    m_data = data;
    m_hasData = true;
    
    // 更新端口显示
    update();
}

QVariant BasePort::getData() const
{
    return m_data;
}

bool BasePort::hasData() const
{
    return m_hasData;
}

void BasePort::addConnection(QGraphicsItem* connection)
{
    if (!m_connections.contains(connection)) {
        m_connections.append(connection);
    }
}

void BasePort::removeConnection(QGraphicsItem* connection)
{
    m_connections.removeAll(connection);
}